package cn.heyige.backend.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cn.heyige.backend.entity.DivinationRecordDO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 占卜记录Mapper接口
 */
public interface DivinationRecordMapper extends BaseMapper<DivinationRecordDO> {
    
    /**
     * 根据用户ID查找占卜记录（分页）
     * @param page 分页对象
     * @param userId 用户ID
     * @return 分页的占卜记录
     */
    IPage<DivinationRecordDO> findByUserIdOrderByCreatedAtDesc(Page<DivinationRecordDO> page, @Param("userId") Integer userId);
    
    /**
     * 根据用户ID和类型查找占卜记录（分页）
     * @param page 分页对象
     * @param userId 用户ID
     * @param divinationType 占卜类型
     * @return 分页的占卜记录
     */
    IPage<DivinationRecordDO> findByUserIdAndDivinationTypeOrderByCreatedAtDesc(
            Page<DivinationRecordDO> page,
            @Param("userId") Integer userId,
            @Param("divinationType") DivinationRecordDO.DivinationType divinationType);
    
    /**
     * 根据用户ID和日期范围查找占卜记录（分页）
     * @param page 分页对象
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 分页的占卜记录
     */
    IPage<DivinationRecordDO> findByUserIdAndCreatedAtBetweenOrderByCreatedAtDesc(
            Page<DivinationRecordDO> page,
            @Param("userId") Integer userId,
            @Param("startDate") LocalDateTime startDate, 
            @Param("endDate") LocalDateTime endDate);
    
    /**
     * 根据用户ID、类型和日期范围查找占卜记录（分页）
     * @param page 分页对象
     * @param userId 用户ID
     * @param divinationType 占卜类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 分页的占卜记录
     */
    IPage<DivinationRecordDO> findByUserIdAndDivinationTypeAndCreatedAtBetweenOrderByCreatedAtDesc(
            Page<DivinationRecordDO> page,
            @Param("userId") Integer userId,
            @Param("divinationType") DivinationRecordDO.DivinationType divinationType,
            @Param("startDate") LocalDateTime startDate, 
            @Param("endDate") LocalDateTime endDate);
    
    /**
     * 根据用户ID和记录ID查找单个记录
     * @param userId 用户ID
     * @param recordId 记录ID
     * @return 占卜记录
     */
    @Select("SELECT * FROM divination_records WHERE user_id = #{userId} AND record_id = #{recordId}")
    DivinationRecordDO findByUserIdAndRecordId(@Param("userId") Integer userId, @Param("recordId") Integer recordId);
    
    /**
     * 查找用户的收藏记录（分页）
     * @param page 分页对象
     * @param userId 用户ID
     * @return 分页的收藏记录
     */
    IPage<DivinationRecordDO> findByUserIdAndIsFavoriteTrueOrderByFavoritedAtDesc(Page<DivinationRecordDO> page, @Param("userId") Integer userId);
    
    /**
     * 统计用户的占卜记录总数
     * @param userId 用户ID
     * @return 记录总数
     */
    @Select("SELECT COUNT(*) FROM divination_records WHERE user_id = #{userId}")
    long countByUserId(@Param("userId") Integer userId);
    
    /**
     * 统计用户的收藏记录总数
     * @param userId 用户ID
     * @return 收藏总数
     */
    @Select("SELECT COUNT(*) FROM divination_records WHERE user_id = #{userId} AND is_favorite = true")
    long countByUserIdAndIsFavoriteTrue(@Param("userId") Integer userId);
    
    /**
     * 统计用户各类型占卜记录数量
     * @param userId 用户ID
     * @return 类型分布统计
     */
    @Select("SELECT divination_type, COUNT(*) FROM divination_records WHERE user_id = #{userId} GROUP BY divination_type")
    List<Object[]> countByUserIdGroupByDivinationType(@Param("userId") Integer userId);
    
    /**
     * 计算用户占卜记录的平均评分
     * @param userId 用户ID
     * @return 平均评分
     */
    @Select("SELECT AVG(feedback_rating) FROM divination_records WHERE user_id = #{userId} AND feedback_rating IS NOT NULL")
    Double getAverageRatingByUserId(@Param("userId") Integer userId);
    
    /**
     * 查找用户今日的占卜记录数量
     * @param userId 用户ID
     * @param startOfDay 今日开始时间
     * @param endOfDay 今日结束时间
     * @return 今日占卜次数
     */
    @Select("SELECT COUNT(*) FROM divination_records WHERE user_id = #{userId} AND created_at BETWEEN #{startOfDay} AND #{endOfDay}")
    long countByUserIdAndCreatedAtBetween(@Param("userId") Integer userId, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay);
    
    /**
     * 删除用户的占卜记录
     * @param userId 用户ID
     * @param recordId 记录ID
     * @return 删除的记录数
     */
    @Select("DELETE FROM divination_records WHERE user_id = #{userId} AND record_id = #{recordId}")
    long deleteByUserIdAndRecordId(@Param("userId") Integer userId, @Param("recordId") Integer recordId);
}